package com.afd.ozblip.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;

/**
 * 字符串处理工具类
 * 
 * @author 技术组
 * 
 */
public class StringUtil {

	/**
	 * 过滤<, >,\n 字符的方法。
	 * 
	 * @param input
	 *            需要过滤的字符
	 * @return 完成过滤以后的字符串
	 */
	public static String filterHTML(String str) {
		if (str == null) {
			return null;
		}
		if (str.length() == 0) {
			return str;
		}
		// 用特定的字符代替指定的字符
		str = str.replaceAll("&", "&amp;");
		str = str.replaceAll("<", "&lt;");
		str = str.replaceAll(">", "&gt;");
		str = str.replaceAll(" ", "&nbsp;");
		str = str.replaceAll("'", "&#39;");
		str = str.replaceAll("\"", "&quot;");
		return str.replaceAll("\n", "<br>");
	}

	/**
	 * 验证字符串是否为空（null或空字符串）
	 * 
	 * @param str
	 *            要验证的字符串
	 * @return 验证结果（字符串为空返回true，否则返回false）
	 */
	public static boolean isNullOrEmpty(String str) {
		if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) {
			return true;
		}
		return false;
	}

	/**
	 * 验证手机号码
	 * 
	 * @param mobiles
	 * @return
	 */
	public static boolean isMobileNO(String mobiles) {
		Pattern p = Pattern
				.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
		Matcher m = p.matcher(mobiles);
		return m.matches();
	}

	/**
	 * 得到天数的毫秒
	 * 
	 * @param date
	 * @return
	 */
	public static long getDateLong(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
		try {
			Date d = sdf.parse(date);
			return d.getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return 0l;
	}
	/**
	 * 得到yyyy-MM-dd HH:ss格式的时间
	 * 
	 * @param date
	 * @return
	 */
	@SuppressLint("SimpleDateFormat")
	public static String getFormatData(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:ss");
		try {
			Date d = sdf.parse(date);
			SimpleDateFormat strSdf = new SimpleDateFormat("yyyy-MM-dd HH:ss");   
			String sdate = strSdf.format(d);
			return sdate;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return "";
	}
	/**
	 * 得到yyyy-MM-dd HH:ss格式的时间
	 * 
	 * @param date
	 * @return
	 */
	@SuppressLint("SimpleDateFormat")
	public static String getFormatData1(Date date) {
		try {
			SimpleDateFormat strSdf = new SimpleDateFormat("yyyy-MM-dd HH:ss:mm");
			strSdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));  //加上这行代码就哦了  
			String sdate = strSdf.format(date);
			return sdate;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * 验证电话号码
	 * 
	 * @param phone
	 * @return
	 */
	public static boolean isPhone(String phone) {
		Pattern p = Pattern.compile("^[0-9]{1,11}$");
		Matcher m = p.matcher(phone);
		return m.matches();
	}

	/**
	 * 验证邮箱格式
	 * 
	 * @param email
	 * @return
	 */
	public static boolean isEmail(String email) {
		Pattern p = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$",
				Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(email);
		return m.matches();
	}

	/**
	 * 返回字符串处理结果
	 * 
	 * @param str
	 *            要处理的字符串
	 * @return 处理结果
	 */
	public static String processStr(String str) {
		if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) {
			return "暂无";
		}
		return str;
	}

	/**
	 * 获取处理后的金额字符串
	 * 
	 * @param str
	 *            要处理的字符串
	 * @return 处理结果
	 */
	public static String getMoneyStr(String str, int digit) {
		if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) {
			return "0.00";
		} else {
			return String.format("%." + digit + "f", Double.parseDouble(str));
		}
	}

	/**
	 * 获取处理后的整数字符串
	 * 
	 * @param str
	 *            要处理的字符串
	 * @return 处理结果
	 */
	public static String getIntegerStr(String str) {
		if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) {
			return "0";
		} else {
			Double temp = Double.valueOf(str);
			return String.valueOf(temp.intValue());
		}
	}

	/**
	 * 验证数字是否为空或0
	 * 
	 * @param number
	 *            要验证的数字
	 * @return 验证结果（字符串为空返回true，否则返回false）
	 */
	public static boolean isNullOrZero(Integer number) {
		if (number == null || number == 0) {
			return true;
		}
		return false;
	}

	/**
	 * 计算字符串的字节长度(字母数字计1，汉字及标点计2) 　　
	 * 
	 * @param str
	 *            要验证的字符串
	 * @return 验证结果，返回字符串的字节长度　
	 */

	public static int byteLength(String str) {
		int count = 0;
		for (int i = 0; i < str.length(); i++) {
			if (Integer.toHexString(str.charAt(i)).length() == 4) {
				count += 2;
			} else {
				count++;
			}
		}
		return count;
	}

	/**
	 * 按指定长度，省略字符串部分字符
	 * 
	 * @param str
	 *            字符串
	 * @param len
	 *            省略后字符串长度
	 * @return 省略后的字符串
	 */
	public static String omitString(String str, int len) {
		int strLen = str.length();
		if (len < strLen) {
			String tempStr = str.substring(0, len - 3);
			return tempStr + "...";
		} else {
			return str;
		}

	}

	/**
	 * 分割图片
	 * 
	 * @param images
	 * @return
	 */
	public static String[] getImageList(String images, String sp) {
		if (isNullOrEmpty(images)) {
			return null;
		}
		return images.split(sp);
	}

	/**
	 * 将Bitmap保存为文件
	 * 
	 * @param bitmap
	 * @return
	 */
	public static String storeInSD(Bitmap bitmap, String path) {
		// String path = Environment.getExternalStorageDirectory()
		// + "/TCH/Image";

		File file = new File(path);
		if (!file.exists()) {
			file.mkdir();
		}
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH);
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int minute = calendar.get(Calendar.MINUTE);
		int second = calendar.get(Calendar.SECOND);

		String name = year + "-" + month + "-" + day + "-" + hour + "-"
				+ minute + "-" + second + ".jpg";

		File imageFile = new File(file, name);

		try {
			imageFile.createNewFile();
			FileOutputStream fos = new FileOutputStream(imageFile);
			bitmap.compress(CompressFormat.JPEG, 100, fos);
			fos.flush();
			fos.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return path + "/" + name;
	}


	/**
	 * MD5 加密
	 */
	public static String getMD5Str(String str) {
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance("MD5");
			messageDigest.reset();
			messageDigest.update(str.getBytes("UTF-8"));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		byte[] byteArray = messageDigest.digest();
		StringBuffer md5StrBuff = new StringBuffer();
		for (int i = 0; i < byteArray.length; i++) {
			if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
				md5StrBuff.append("0").append(
						Integer.toHexString(0xFF & byteArray[i]));
			} else {
				md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
			}
		}
		return md5StrBuff.toString();
	}

	/**
	 * Utf8URL编码
	 * 
	 * @param s
	 * @return
	 */
	public static String Utf8URLencode(String text) {
		StringBuffer result = new StringBuffer();

		for (int i = 0, len = text.length(); i < len; i++) {
			char c = text.charAt(i);
			if (c >= 0 && c <= 255) {
				result.append(c);
			} else {
				byte[] b = new byte[0];
				try {
					b = Character.toString(c).getBytes("UTF-8");
				} catch (Exception ex) {
				}
				for (int j = 0, blen = b.length; j < blen; j++) {
					int k = b[j];
					if (k < 0) {
						k += 256;
					}
					result.append("%" + Integer.toHexString(k).toUpperCase());
				}
			}
		}
		return result.toString();
	}

	public static String getMD5(String instr) {
		String s = null;
		// 用来将字节转换成 16 进制表示的字�?
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f' };
		try {
			java.security.MessageDigest md = java.security.MessageDigest
					.getInstance("MD5");
			md.update(instr.getBytes());
			byte tmp[] = md.digest(); // MD5 的计算结果是�?�� 128 位的长整数，
										// 用字节表示就�?16 个字�?
			char str[] = new char[16 * 2]; // 每个字节�?16 进制表示的话，使用两个字符，
											// �?��表示�?16 进制�?�� 32 个字�?
			int k = 0; // 表示转换结果中对应的字符位置
			for (int i = 0; i < 16; i++) { // 从第�?��字节�?��，对 MD5 的每�?��字节
											// 转换�?16 进制字符的转�?
				byte byte0 = tmp[i]; // 取第 i 个字�?
				str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中�?4 位的数字转换,
															// >>>
															// 为�?辑右移，将符号位�?��右移
				str[k++] = hexDigits[byte0 & 0xf]; // 取字节中�?4 位的数字转换
			}
			s = new String(str).toUpperCase(); // 换后的结果转换为字符�?

		} catch (Exception e) {

		}
		return s;
	}

	/**
	 * 冲字符串中提取出想要的字符
	 * 
	 * @param rs
	 * @param type
	 * @return
	 */
	public static int getLeng(String rs) {
		String types[] = new String[] { "米", "公里", "里" };
		int sum = 0;
		int fanyi = 1;
		String type = "";
		for (int i = 0; i < types.length; i++) {
			type = types[i];
			if (type.equals("米")) {
				if (rs.indexOf("米") < 0) {
					return sum;
				}
				fanyi = 1;
			} else if (type.equals("里")) {
				if (rs.indexOf("里") < 0) {
					return sum;
				}
				fanyi = 500;
			} else if (type.equals("公里")) {
				if (rs.indexOf("公里") < 0) {
					return sum;
				}
				fanyi = 1000;
			}
			Pattern p = Pattern.compile("([0-9]+)" + type);
			Matcher m = p.matcher(rs);
			String s = "";
			while (m.find()) {
				s = m.group(1);
				sum += Integer.parseInt(s) * fanyi;
			}
		}
		return sum;
	}
}